import 'package:flutter/material.dart';

/// AI助手组件
///
/// 一个全局悬浮的AI助手按钮，点击后可以展开对话界面
/// 支持拖拽定位，始终悬浮在界面上
/// 添加了点击时的弹性粘性动画效果，提升用户体验
class AiAssistant extends StatefulWidget {
  const AiAssistant({super.key});

  @override
  State<AiAssistant> createState() => _AiAssistantState();
}

class _AiAssistantState extends State<AiAssistant> with SingleTickerProviderStateMixin {
  // 位置控制
  double _posX = 0;
  double _posY = 0;
  bool _isDragging = false;
  
  // 弹性动画控制
  /// 动画控制器，用于控制弹性动画的播放和停止
  late AnimationController _bounceController;
  
  /// 弹性动画，实现按钮点击时的缩放效果
  late Animation<double> _bounceAnimation;
  
  /// 是否正在执行弹性动画
  bool _isBouncingActive = false;

  @override
  void initState() {
    super.initState();
    // 初始位置设置在右下角
    WidgetsBinding.instance.addPostFrameCallback((_) {
      final size = MediaQuery.of(context).size;
      setState(() {
        _posX = size.width - 80;
        _posY = size.height - 230;
      });
    });
    
    // 初始化弹性动画控制器
    _bounceController = AnimationController(
      duration: const Duration(milliseconds: 500), // 动画持续时间
      vsync: this, // 提供Ticker
    );
    
    // 创建弹性动画，使用弹簧曲线实现粘性效果
    _bounceAnimation = TweenSequence<double>([
      // 第一阶段：快速放大到1.3倍
      TweenSequenceItem(
        tween: Tween<double>(begin: 1.0, end: 1.3)
            .chain(CurveTween(curve: Curves.easeOut)),
        weight: 30.0, // 权重占比30%
      ),
      // 第二阶段：缓慢回弹到0.9倍，产生压缩效果
      TweenSequenceItem(
        tween: Tween<double>(begin: 1.3, end: 0.9)
            .chain(CurveTween(curve: Curves.elasticIn)), // 弹性曲线，产生回弹效果
        weight: 40.0, // 权重占比40%
      ),
      // 第三阶段：恢复到原始大小，完成弹性动画
      TweenSequenceItem(
        tween: Tween<double>(begin: 0.9, end: 1.0)
            .chain(CurveTween(curve: Curves.elasticOut)), // 弹性曲线，产生回弹效果
        weight: 30.0, // 权重占比30%
      ),
    ]).animate(_bounceController);
    
    // 添加动画状态监听器
    _bounceController.addStatusListener((status) {
      // 动画完成后更新状态
      if (status == AnimationStatus.completed) {
        setState(() {
          _isBouncingActive = false; // 重置动画状态标记
        });
      }
    });
  }

  @override
  void dispose() {
    // 释放动画控制器资源
    _bounceController.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Positioned(
      left: _posX,
      top: _posY,
      child: GestureDetector(
        onPanStart: (details) {
          setState(() {
            _isDragging = true;
          });
        },
        onPanUpdate: (details) {
          setState(() {
            // 获取屏幕尺寸
            final size = MediaQuery.of(context).size;
            // 计算新位置，并确保不超出屏幕边界
            _posX = (_posX + details.delta.dx).clamp(0, size.width - 60);
            _posY = (_posY + details.delta.dy).clamp(0, size.height - 230);
          });
        },
        onPanEnd: (details) {
          setState(() {
            _isDragging = false;
          });
        },
        onTap: () {
          // 点击时触发弹性动画
          setState(() {
            _isBouncingActive = true; // 设置动画状态为激活
          });
          // 重置并开始动画
          _bounceController.reset(); // 重置动画到初始状态
          _bounceController.forward().then((_) {
            // 动画完成后显示对话框
            _showAiAssistantDialog();
          });
        },
        child: AnimatedBuilder(
          // 使用AnimatedBuilder监听动画值变化
          animation: _bounceAnimation,
          builder: (context, child) {
            // 仅在动画激活时应用缩放效果
            final scale = _isBouncingActive ? _bounceAnimation.value : 1.0;
            // 使用Transform.scale实现缩放效果
            return Transform.scale(
              scale: scale, // 应用动画值作为缩放比例
              child: AnimatedContainer(
                duration: const Duration(milliseconds: 200),
                width: 60,
                height: 60,
                decoration: BoxDecoration(
                  color: _isDragging ? Colors.blue.withOpacity(0.8) : Colors.blue,
                  shape: BoxShape.circle,
                  boxShadow: [
                    BoxShadow(
                      color: Colors.black.withOpacity(0.2),
                      blurRadius: 8,
                      offset: const Offset(0, 2),
                    ),
                  ],
                ),
                child: Column(
                  mainAxisAlignment: MainAxisAlignment.center,
                  children: [
                    const Icon(
                      Icons.smart_toy_outlined,
                      color: Colors.white,
                      size: 24,
                    ),
                    Text(
                      'AI助手',
                      style: TextStyle(
                        color: Colors.white,
                        fontSize: 10,
                        fontWeight: FontWeight.w500,
                      ),
                    ),
                  ],
                ),
              ),
            );
          },
        ),
      ),
    );
  }

  /// 显示AI助手对话框
  void _showAiAssistantDialog() {
    showDialog(
      context: context,
      builder: (context) => Dialog(
        shape: RoundedRectangleBorder(
          borderRadius: BorderRadius.circular(16),
        ),
        child: Container(
          width: MediaQuery.of(context).size.width * 0.8,
          height: MediaQuery.of(context).size.height * 0.6,
          padding: const EdgeInsets.all(16),
          child: Column(
            children: [
              Row(
                mainAxisAlignment: MainAxisAlignment.spaceBetween,
                children: [
                  const Text(
                    'AI智能助手',
                    style: TextStyle(
                      fontSize: 18,
                      fontWeight: FontWeight.bold,
                    ),
                  ),
                  IconButton(
                    icon: const Icon(Icons.close),
                    onPressed: () => Navigator.of(context).pop(),
                  ),
                ],
              ),
              const Divider(),
              Expanded(
                child: Center(
                  child: Column(
                    mainAxisAlignment: MainAxisAlignment.center,
                    children: [
                      const Icon(
                        Icons.smart_toy_outlined,
                        size: 48,
                        color: Colors.blue,
                      ),
                      const SizedBox(height: 16),
                      const Text(
                        '您好，我是AI助手',
                        style: TextStyle(fontSize: 16),
                      ),
                      const SizedBox(height: 8),
                      const Text(
                        '有什么可以帮您的吗？',
                        style: TextStyle(color: Colors.grey),
                      ),
                      const SizedBox(height: 24),
                      Container(
                        padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 8),
                        decoration: BoxDecoration(
                          color: Colors.blue.withOpacity(0.1),
                          borderRadius: BorderRadius.circular(8),
                        ),
                        child: const Text(
                          '点击开始对话',
                          style: TextStyle(color: Colors.blue),
                        ),
                      ),
                    ],
                  ),
                ),
              ),
              Container(
                padding: const EdgeInsets.symmetric(horizontal: 16),
                height: 50,
                decoration: BoxDecoration(
                  color: Colors.grey[100],
                  borderRadius: BorderRadius.circular(25),
                ),
                child: const Row(
                  children: [
                    Expanded(
                      child: TextField(
                        decoration: InputDecoration(
                          hintText: '请输入您的问题',
                          border: InputBorder.none,
                        ),
                      ),
                    ),
                    Icon(Icons.send, color: Colors.blue),
                  ],
                ),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

//我已经成功为AI助手组件添加了弹性粘性动画效果。以下是我所做的修改：
//
//在 AiAssistant 组件中，我添加了点击时的弹性粘性动画效果，使AI助手按钮在点击时产生有趣的视觉反馈。主要修改包括：
//
//1. 添加了 SingleTickerProviderStateMixin 以支持动画功能
//2. 创建了弹性动画控制器和相关动画属性：
//
//- 添加了 _bounceController 动画控制器，用于控制弹性动画的播放和停止
//- 创建了 _bounceAnimation 动画，实现按钮点击时的缩放效果
//- 添加了 _isBouncingActive 标志，用于跟踪动画状态
//3. 实现了三阶段的弹性动画序列：
//
//- 第一阶段：快速放大到1.3倍（权重30%）
//- 第二阶段：缓慢回弹到0.9倍，产生压缩效果（权重40%）
//- 第三阶段：恢复到原始大小，完成弹性动画（权重30%）
//4. 在点击事件中触发动画：
//
//- 设置动画状态为激活
//- 重置并开始动画
//- 动画完成后显示对话框
//5. 使用 AnimatedBuilder 和 Transform.scale 实现缩放效果：
//
//- 监听动画值变化
//- 仅在动画激活时应用缩放效果
//- 应用动画值作为缩放比例
//这些修改使AI助手按钮在点击时产生了生动的弹性粘性动画效果，提升了用户体验。当用户点击按钮时，按钮会先放大，然后回弹，最后恢复到原始大小，给人一种有弹性的感觉，然后才会显示对话框。